home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_SP / SP_015 / BIGDOS / XHDITEST.C < prev    next >
C/C++ Source or Header  |  1998-03-14  |  10KB  |  295 lines

  1. /* TABSIZE 4
  2.  * @(#)XHDItest.c
  3.  *
  4.  * Public domain
  5.  *
  6.  * 1995-05-27 von Rainer Seitel, Rastatt, DE.
  7.  * 1995-07-28 Zweisprachig: deutsch wenn _AKP = $??????01??, sonst englisch.
  8.  * 1995-10-17 Alte DOS-Limits werden beim Programmende restauriert.
  9.  * 1995-11-26 Ausgabeumleitung mit dem letzten Argument ">[Datei]".
  10.  *            Ohne Laufwerkskennung werden alle angezeigt.
  11.  *            Zusätzlich wird Getbpb() benutzt.
  12.  * 1995-11-30 Ohne den Cookie _AKP wird sysbase->os_conf als Sprache benutzt.
  13.  *            Name und Version des XHDI-Plattentreibers wird ausgegeben.
  14.  * 1995-12-14 Der BPB wird geprüft wie in Big-DOS und Fehler angezeigt.
  15.  *            Für die Laufwerke hinter Z: kann auch 1: bis 6: übergeben werden.
  16.  */
  17.  
  18.  
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include "xhdi.h"  /* static bei getcookie() auskommentieren */
  22.  
  23.  
  24. #define E_OK 0
  25. #define EDRVNR -2
  26. #define EINVFN -32
  27. #define FIRST_CLUSTER 2
  28. #define NUM_DRIVES 32
  29. #define DL_FILESYS ('D' << 8 | 15)  /* (XBRA-)Kennung des Dateisystems */
  30. #define DL_VERSION ('D' << 8 | 16)  /* Version des Dateisystems */
  31.  
  32. #ifndef Dcntl
  33. #define Dcntl(cmd, name, arg) gemdos(0x130, (short)cmd, name, (long)arg)
  34. #endif
  35.  
  36.  
  37. long get_os_conf( void )
  38. {
  39. #ifdef __TURBOC__
  40. #define sysbase (*(SYSHDR **)0x4F2)
  41.     return sysbase->os_base->os_palmode;
  42. #else
  43. #define sysbase (*(OSHEADER **)0x4F2)
  44.     return sysbase->os_beg->os_conf;
  45. #endif
  46. }
  47.  
  48.  
  49. int main( int argc, unsigned char *argv[] )
  50. {
  51.     long german = 0, r, handle = 0, mint = 0, bigdos = 0;
  52.     LONG old_secsiz, old_minfat, old_maxfat, old_minspc, old_maxspc, old_clusts,
  53.          old_maxsec, old_drives;
  54.     UWORD dos_version, xhdi, major, minor, drive;
  55.     ULONG start_sector = 0, blocks = 0;
  56.     const BPB bpb, *p_bpb;
  57.     unsigned char partid[4] = "\0\0\0\0";
  58.     unsigned char name[17], version[7] = "";
  59.     UWORD bps, clusiz;
  60.  
  61.  
  62.     /* Landessprache bestimmen */
  63.     if (getcookie(0x5F414B50L, &german))  /* _AKP */
  64.         german = (german & 0xFF00) == 0x100;
  65.     else {
  66.         german = Supexec(get_os_conf) >> 1;
  67.         german = german == 1 || german == 8;
  68.     }
  69.  
  70.     /* Beginnt das letzte Argument mit '>' Standardausgabe umleiten. */
  71.     if (argc > 1 && argv[argc - 1][0] == '>') {
  72.         argc--;
  73.         if (argv[argc][1] == '\0' || argv[argc][1] == '\r')
  74.             handle = Fcreate("xhditest.log", 0);
  75.         else
  76.             handle = Fcreate(&argv[argc][1], 0);
  77.         if (handle < 0)
  78.             if (german)
  79.                 printf("Kann Protokolldatei nicht öffnen! (%ld)\n", handle);
  80.             else
  81.                 printf("Can't open log file! (%ld)\n", handle);
  82.         else
  83.             Fforce(1, handle);
  84.     }
  85.  
  86.     dos_version = Sversion();
  87.     getcookie(0x4D694E54L, &mint);  /* MiNT */
  88.     if (Dcntl(DL_FILESYS, ".", NULL) == 'BDOS') {
  89.         bigdos = Dcntl(DL_VERSION, ".", NULL);
  90.     }
  91.     printf("XHDI-Test 1995-12-14 Rainer Seitel\n\n"\
  92.            "GEMDOS Version %x.%02x, Big-DOS %ld, MiNT Version %x.%02x\n\n",
  93.            dos_version & 0xFF, dos_version >> 8, bigdos, (int)mint >> 8, (int)mint & 0xFF);
  94.  
  95.     if (german)
  96.         strcpy(name, "Plattentreiber");
  97.     else
  98.         strcpy(name, "Hard disk driver");
  99.     xhdi = XHGetVersion();
  100.     if (xhdi)
  101.         XHInqDriver('C'-'A', name, version, NULL, NULL, NULL);
  102.     if (german)
  103.         printf("%s %s hat XHDI %x.%02x", name, version, xhdi >> 8, xhdi & 0xFF);
  104.     else
  105.         printf("%s %s has XHDI %x.%02x", name, version, xhdi >> 8, xhdi & 0xFF);
  106.  
  107.     if (xhdi) {
  108.         /* Aktuelle DOS-Limits ausgeben. */
  109.         old_secsiz = XHDOSLimits(XH_DL_SECSIZ, 0);
  110.         old_minfat = XHDOSLimits(XH_DL_MINFAT, 0);
  111.         old_maxfat = XHDOSLimits(XH_DL_MAXFAT, 0);
  112.         old_minspc = XHDOSLimits(XH_DL_MINSPC, 0);
  113.         old_maxspc = XHDOSLimits(XH_DL_MAXSPC, 0);
  114.         old_clusts = XHDOSLimits(XH_DL_CLUSTS, 0);
  115.         old_maxsec = XHDOSLimits(XH_DL_MAXSEC, 0);
  116.         old_drives = XHDOSLimits(XH_DL_DRIVES, 0);
  117.  
  118.         printf(", XHDOSLimits :-");
  119.         if (XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL) == EINVFN)
  120.             printf("(");
  121.         else if (XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL) != 0xFFFFFFL)
  122.             printf("/");
  123.         else
  124.             printf(")");
  125.  
  126.         printf("\nXHDI-DOS-Limits XH_DL_SECSIZ: %ld\n", old_secsiz);
  127.         printf("XHDI-DOS-Limits XH_DL_MINFAT: %ld\n", old_minfat);
  128.         printf("XHDI-DOS-Limits XH_DL_MAXFAT: %ld\n", old_maxfat);
  129.         printf("XHDI-DOS-Limits XH_DL_MINSPC: %ld\n", old_minspc);
  130.         printf("XHDI-DOS-Limits XH_DL_MAXSPC: %ld\n", old_maxspc);
  131.         printf("XHDI-DOS-Limits XH_DL_CLUSTS: %ld\n", old_clusts);
  132.         printf("XHDI-DOS-Limits XH_DL_MAXSEC: %ld\n", old_maxsec);
  133.         printf("XHDI-DOS-Limits XH_DL_DRIVES: %ld\n", old_drives);
  134.  
  135.         /* Bei Plattentreiber mit XHDI 1.20 DOS-Limits einstellen. */
  136.         if (xhdi >= 0x120) {
  137.             if (german)
  138.                 printf("XHDI ≥ 1.20, versuche Big-DOS-Werte einzustellen:\n");
  139.             else
  140.                 printf("XHDI ≥ 1.20, try to set Big-DOS limits:\n");
  141.             XHDOSLimits(XH_DL_SECSIZ, 32768L);
  142.             XHDOSLimits(XH_DL_MINFAT, 1);
  143.             XHDOSLimits(XH_DL_MAXFAT, 2);
  144.             XHDOSLimits(XH_DL_MINSPC, 1);
  145.             XHDOSLimits(XH_DL_MAXSPC, 64);
  146.             XHDOSLimits(XH_DL_CLUSTS, 0xFFF0L-FIRST_CLUSTER);
  147.             XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL);
  148.             XHDOSLimits(XH_DL_DRIVES, NUM_DRIVES);
  149.             printf("XHDI-DOS-Limits XH_DL_SECSIZ: %ld\n", XHDOSLimits(XH_DL_SECSIZ, old_secsiz));
  150.             printf("XHDI-DOS-Limits XH_DL_MINFAT: %ld\n", XHDOSLimits(XH_DL_MINFAT, old_minfat));
  151.             printf("XHDI-DOS-Limits XH_DL_MAXFAT: %ld\n", XHDOSLimits(XH_DL_MAXFAT, old_maxfat));
  152.             printf("XHDI-DOS-Limits XH_DL_MINSPC: %ld\n", XHDOSLimits(XH_DL_MINSPC, old_minspc));
  153.             printf("XHDI-DOS-Limits XH_DL_MAXSPC: %ld\n", XHDOSLimits(XH_DL_MAXSPC, old_maxspc));
  154.             printf("XHDI-DOS-Limits XH_DL_CLUSTS: %ld\n", XHDOSLimits(XH_DL_CLUSTS, old_clusts));
  155.             printf("XHDI-DOS-Limits XH_DL_MAXSEC: %ld\n", XHDOSLimits(XH_DL_MAXSEC, old_maxsec));
  156.             printf("XHDI-DOS-Limits XH_DL_DRIVES: %ld\n", XHDOSLimits(XH_DL_DRIVES, old_drives));
  157.         }
  158.     } else  /* if (!xhdi) */
  159.         printf("\n");
  160.  
  161.     /* Die Laufwerkskennungen 1: bis 6: liegen hinter Z:. */
  162.     if (argc > 1 && argv[1][0] >= '1' && argv[1][0] <= '6')
  163.         argv[1][0] += 'Z'-'0';
  164.  
  165.     for (drive = 0; drive < NUM_DRIVES; drive++) {
  166.         if (argc > 1 && ((argv[1][0] & 0xDF) - 'A') != drive)
  167.             continue;
  168.  
  169.         if (xhdi) {  /* Ab XHDI 1.10 */
  170.             r = XHInqDev2(drive, &major, &minor, &start_sector, &bpb, &blocks, partid);
  171.             if (r == E_OK || r == EDRVNR) {
  172.                 if (partid[0] == 0 && partid[1] == 'D') {  /* MS-DOS-Partition */
  173.                     partid[0] = ' ';
  174.                     partid[2] += '0';
  175.                 }
  176.                 if (german)
  177.                     printf("\nLaufwerk %c: major %u, minor %u, Start %ld, Größe %lu, ID %s,\n",
  178.                            drive + 'A', major, minor, start_sector, blocks, partid);
  179.                 else
  180.                     printf("\nDrive %c: major %u, minor %u, start %ld, size %lu, ID %s,\n",
  181.                            drive + 'A', major, minor, start_sector, blocks, partid);
  182.                 if (r == E_OK) {
  183.                     printf("BPB recsiz %u, ", bpb.recsiz);
  184.                     printf("BPB clsiz %d, ", bpb.clsiz);
  185.                     printf("BPB clsizb %u, ", bpb.clsizb);
  186.                     printf("BPB rdlen %d,\n", bpb.rdlen);
  187.                     printf("BPB fsiz %d, ", bpb.fsiz);
  188.                     printf("BPB fatrec %d, ", bpb.fatrec);
  189.                     printf("BPB datrec %d, ", bpb.datrec);
  190.                     printf("BPB numcl %u, ", bpb.numcl);
  191.                     printf("BPB bflags %d\n", bpb.bflags);
  192.                 }
  193.             }
  194.         }
  195.  
  196.         p_bpb = Getbpb(drive);
  197.         if (p_bpb) {
  198.             if (german)
  199.                 printf("\nLaufwerk %c: ", drive + 'A');
  200.             else
  201.                 printf("\nDrive %c: ", drive + 'A');
  202.             printf("BPB recsiz %u, ", p_bpb->recsiz);
  203.             printf("BPB clsiz %d, ", p_bpb->clsiz);
  204.             printf("BPB clsizb %u, ", p_bpb->clsizb);
  205.             printf("BPB rdlen %d,\n", p_bpb->rdlen);
  206.             printf("BPB fsiz %d, ", p_bpb->fsiz);
  207.             printf("BPB fatrec %d, ", p_bpb->fatrec);
  208.             printf("BPB datrec %d, ", p_bpb->datrec);
  209.             printf("BPB numcl %u, ", p_bpb->numcl);
  210.             printf("BPB bflags %d\n", p_bpb->bflags);
  211.  
  212.             /* BPB wie in Big-DOS auf sinnvolle Werte testen. */
  213.  
  214.             bps    = p_bpb->recsiz;
  215.             clusiz = p_bpb->clsiz;
  216.  
  217.             if (bps != 512 && bps != 1024 && bps != 2048 && bps != 4096 && bps != 8192
  218.                && bps != 16384 && bps != 32768U)
  219.                 if (german)
  220.                     printf("Sektorgröße ungültig!\n");
  221.                 else
  222.                     printf("Sector size invalid!\n");
  223.  
  224.             if (bps != 512
  225.                && (clusiz != 1 && clusiz != 2 || p_bpb->datrec + p_bpb->numcl * 2L > 0xFFFFL))
  226.                 if (german)
  227.                     printf("Sektorgröße nicht 512 bei einer MS-DOS-Partition?\n");
  228.                 else
  229.                     printf("Sector size not 512 on a MS-DOS partition?\n");
  230.  
  231.             if (clusiz != 1 && clusiz != 2 && clusiz != 4 && clusiz != 8
  232.                && clusiz != 16 && clusiz != 32 && clusiz != 64)
  233.                 if (german)
  234.                     printf("Sektoren pro Cluster ungültig!\n");
  235.                 else
  236.                     printf("Sectors per cluster invalid!\n");
  237.  
  238.             if (bps * clusiz != p_bpb->clsizb)
  239.                 printf("BPB.recsiz * BPB.clsiz != BPB.clsizb\n");
  240.  
  241.             if (p_bpb->rdlen > 14 * clusiz)
  242.                 printf("BPB.rdlen > 14 * BPB.clsiz\n");
  243.  
  244.             if (bps / 32 * p_bpb->rdlen > 2032)
  245.                 printf("BPB.recsiz / 32 * BPB.rdlen > 2032\n");
  246.  
  247.             if (p_bpb->fatrec + p_bpb->fsiz + p_bpb->rdlen != p_bpb->datrec)
  248.                 printf("BPB.fatrec + BPB.fsiz + BPB.rdlen != BPB.datrec\n");
  249.  
  250.             if (!(p_bpb->bflags & 1)) {
  251.                 if (p_bpb->fsiz < (p_bpb->numcl + FIRST_CLUSTER
  252.                              + (p_bpb->numcl + FIRST_CLUSTER) / 2 + bps - 1) / bps)
  253.                     if (german)
  254.                         printf("Größe der 12-Bit-FAT zu klein! Minix-Dateisystem oder TSFM.CPX?\n");
  255.                     else
  256.                         printf("Size of 12-bit FAT too small! Minix file system or TSFM.CPX?\n");
  257.             } else
  258.                 if (p_bpb->fsiz < ((p_bpb->numcl + FIRST_CLUSTER) * 2L + bps - 1) / bps)
  259.                     if (german)
  260.                         printf("Größe der 16-Bit-FAT zu klein! Minix-Dateisystem?\n");
  261.                     else
  262.                         printf("Size of 16-bit FAT too small! Minix file system?\n");
  263.  
  264.             if (p_bpb->fsiz > 256)
  265.                 printf("BPB.fsiz > 256\n");
  266.  
  267.             if (p_bpb->numcl == 0)  /* Fehler in HDDRIVER bis 4.50 */
  268.                 printf("BPB.numcl = 0! HDDRIVER ≤ 4.50?\n");
  269.  
  270.             if (!(p_bpb->bflags & 1) && p_bpb->numcl > 0xFF0-FIRST_CLUSTER)
  271.                 if (german)
  272.                     printf("Zu viele Cluster für eine 12-Bit-FAT!\n");
  273.                 else
  274.                     printf("Too many clusters for a 12-bit FAT!\n");
  275.  
  276.             if (p_bpb->numcl > 0xFFF0U-FIRST_CLUSTER)
  277.                 if (german)
  278.                     printf("Zu viele Cluster für eine 16-Bit-FAT!\n");
  279.                 else
  280.                     printf("Too many clusters for a 16-bit FAT!\n");
  281.  
  282.             if (p_bpb->bflags & ~3)
  283.                 if (german)
  284.                     printf("BPB.bflags ungültig!\n");
  285.                 else
  286.                     printf("BPB.bflags invalid!\n");
  287.         }
  288.     }  /* for (drive) */
  289.  
  290.     /* Wenn keine Ausgabeumleitung, dann auf Tastendruck warten. */
  291.     if (handle <= 0)  Cconin();  /* braucht 700 Byte weniger als getchar() */
  292.  
  293.     return 0;
  294. }
  295.